package com.github.tj123.common;

import com.github.tj123.common.convert.BeanConvertException;
import com.github.tj123.common.convert.BeanUtil;
import com.github.tj123.common.validate.impl.NotValidException;

import java.lang.reflect.ParameterizedType;

/**
 * Dto 接口
 */
public interface Dto<PO extends Po<?>> extends Mapable, Validatable {

    /**
     * 转 PO
     *
     * @return
     */
    default PO toPo() throws BeanConvertException {
        return (PO) BeanUtil.convert(this, (Class<?>) ((ParameterizedType) getClass()
                .getGenericSuperclass()).getActualTypeArguments()[0]);
    }

    /**
     * 当数据为 null 时 替换为 ""
     *
     * @param <DTO>
     * @return
     */
    default <DTO extends Dto<?>> DTO fillNull() {
        DTO dto = (DTO) this;
        BeanUtil.fillNull(dto);
        return dto;
    }


    /**
     * 对不为空的进行 trim()
     *
     * @param <DTO>
     * @return
     */
    default <DTO extends Dto<?>> DTO trim() {
        DTO dto = (DTO) this;
        BeanUtil.trim(dto);
        return dto;
    }

    /**
     * 验证并 转为 po
     */
    default PO po() throws NotValidException, BeanConvertException {
        validate();
        return toPo();
    }

    /**
     * 验证并 转为 po
     */
    default PO po(String... fieldNames) throws NotValidException, BeanConvertException {
        validate(fieldNames);
        return toPo();
    }

}
